package main

import (
	"github.com/xiaoxuxiansheng/xtimer/app"
	"net/http"
	_ "net/http/pprof"
	"os"
	"os/signal"
	"syscall"
)

/* 服务架构：
1. 定时任务调度流程：3个模块+2个协程池；xtimer是一个去中心化的定时任务调度框架，根据职责边界，将服务拆分成调度器，触发器和执行器；
各模块间存在依赖关系，父模块通过协程池的方式异步启动子模块进行工作： scheduler -> trigger -> executor


2. 定时任务创建流程：定时任务创建与webserver和migrator2两个模块有关：
				xtimer提供webServer模块，面向用户提供API用于定时器的创建；用户激活定时器后，根据定时器cron表达式批量创建定时任务，用于执行；
				迁移器定期将db中的定时任务提前加载到redis中，使用zset有序表组织，共触发器模块轮询触发
*/
func main() {
	migratorApp := app.GetMigratorApp()
	schedulerApp := app.GetSchedulerApp()
	webServer := app.GetWebServer()
	monitor := app.GetMonitorApp()

	migratorApp.Start()
	schedulerApp.Start()      // 只需要启动scheduler，后续自动调用trigger -> executor
	defer schedulerApp.Stop() // defer 延迟调用机制，通常只有当前函数执行完毕后才能执行。常用于释放资源

	monitor.Start() //
	webServer.Start()

	// 支持 pprof
	go func() {
		http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {})
		_ = http.ListenAndServe(":9999", nil)
	}()

	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT)
	<-quit
}
